home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
comm
/
cpt152.zip
/
CPT-S152.ZIP
/
CPT_CODE.PAS
next >
Wrap
Pascal/Delphi Source File
|
1996-05-16
|
36KB
|
1,139 lines
{$N-,E- no math support needed}
{$X- function calls may not be discarded}
{$I- disable I/O checking (trap errors by checking IOResult)}
UNIT CPT_CODE;
INTERFACE
{$IFDEF DPMI}
USES DOS, NUMDAYS, ARCID;
{$ELSE}
USES DOS, NUMDAYS, ARCID, HEAPMAN;
{$ENDIF}
TYPE
MemLink = ^MemberRec;
MemberRec = RECORD
Name : STRING [25];
sent : WORD;
oldest,
newest : STRING [8];
BBS1,
BBS2 : STRING [79];
notes : STRING [79];
next : MemLink;
END;
CONST
version = ' v1.52 ';
author = 'Copyright (c) May 16th, 1996, by David Daniel Anderson - Reign Ware.';
OldDelimitLine = '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=' +
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=';
DelimitLine = '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' +
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~';
EndOfDB = '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' +
' end of database ' +
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<';
High_Message : STRING [7] = '';
cursorState : BYTE = 1; {0..3}
cursorData : ARRAY [0..3] OF CHAR = (#179, #47, #196, #92);
DATFileName = 'MESSAGES.DAT';
CNFFileName = 'CONTROL.DAT';
lf = #13#10;
VAR confnumb : WORD;
field : STRING;
inverse : BOOLEAN;
VAR
unQWK, unARC, unARJ, unHAP, unLHA,
unPAK, unRAR, unUC2, unZIP, unZOO : PATHSTR;
ExCMD : PATHSTR;
CheckFROM,
Validate,
TrackPrivate : BOOLEAN;
CONFname : STRING [25];
{===========================================================================}
PROCEDURE WriteError (CONST problem: BYTE);
FUNCTION WordToHex (i: WORD): STRING;
PROCEDURE CheckIO;
PROCEDURE cursorOff;
PROCEDURE cursorOn;
PROCEDURE updateCursor;
FUNCTION WhereX: BYTE;
FUNCTION WhereY: BYTE;
PROCEDURE GotoXY (X, Y: BYTE);
PROCEDURE WriteCharAtCursor (X: CHAR);
PROCEDURE ClrEol;
PROCEDURE WriteMemAvail;
FUNCTION IsFile (CONST FileName: PATHSTR): BOOLEAN;
PROCEDURE EraseFile (CONST FileName : STRING);
(* PROCEDURE UpFast (VAR Str: STRING); {** from SWAG **} *)
FUNCTION UpStr (lstr : STRING): STRING;
FUNCTION LowerStr (w: STRING): STRING;
FUNCTION MixCase (s: STRING): STRING;
FUNCTION RTrim (InStr: STRING): STRING;
FUNCTION LTrim (InStr: STRING): STRING;
FUNCTION Squeeze (ss: STRING): STRING;
Function LongIntDays (DayStr: String): LongInt;
FUNCTION GetNewHigh (High, current: STRING): STRING;
FUNCTION MiddleOf (CONST s: STRING): STRING;
FUNCTION GetOriginLine (ol : STRING): STRING;
FUNCTION GetConfNUMBER (CONST PSTR: STRING): PATHSTR;
FUNCTION IsDir (CONST FileName: PATHSTR): BOOLEAN;
FUNCTION GetFilePath (CONST PSTR: STRING; VAR sDir: DIRSTR): PATHSTR;
FUNCTION GetCONFname (CONST QWKpath, CNFFileName: STRING): STRING;
FUNCTION BuildList (VAR list: MemLink; CONST fname: STRING): WORD;
FUNCTION ReadDAT (VAR list: MemLink; CONST DATFileName: STRING): WORD;
FUNCTION Relevant (CONST s: STRING; CONST len: BYTE): STRING;
PROCEDURE GetSortField (CONST PSTR: STRING);
FUNCTION CompareFields (CONST cnode, cnode2: MemLink): BOOLEAN;
PROCEDURE SortLinkedList (VAR list: MemLink); {By Ian Lin, found in SWAG}
PROCEDURE WriteList (VAR list: MemLink; CONST fname: STRING; CONST mems: WORD);
PROCEDURE WriteStats (VAR list: MemLink; CONST fname: STRING; CONST mems: WORD);
PROCEDURE InitCONFIG;
FUNCTION IsArchive (CONST SomeFile: PATHSTR): PATHSTR;
FUNCTION ExtractFile (CONST ArchiveFile, FileToEx: PATHSTR; ExCMD: PATHSTR): BOOLEAN;
{===========================================================================}
IMPLEMENTATION
PROCEDURE WriteError (CONST problem: BYTE);
VAR
message: STRING [79];
BEGIN
CASE problem OF
1 : message := 'Invalid parameter on command line or parameter missing.';
2 : message := 'No files found. First parameter must be a valid file specification.';
3 : message := 'You cannot use ".STT" as the file extension, since .STT is used by CPT-Stat.';
(* Numbers 4 and 5 are -possible- reasons for aborting, but I've chosen not to. *)
(* 4 : message := 'Configuration file not found with executable. Consult the documentation.'; *)
(* 5 : message := 'Unable to run unarchiver! Aborting.'; *)
6 : message := 'You cannot just specify a path, add "*.*" or "\*.*" for all files.';
7 : message := 'File handling error. Original has not been updated, and is possibly corrupt.';
8 : message := 'This database was corrupted by CPT v1.36, read the "CPT-Fix.DOC" file for help.';
ELSE message := 'Unknown error.';
END;
WriteLn (#7, 'Error encountered, number ', problem, ':'); WriteLn (message);
END;
FUNCTION WordToHex (i: WORD): STRING; {Convert a WORD variable to STRING}
CONST
HexLetters : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
BEGIN
WordToHex := Concat (HexLetters [Hi (i) SHR 4], HexLetters [Hi (i) AND 15],
HexLetters [Lo (i) SHR 4], HexLetters [Lo (i) AND 15]);
END;
PROCEDURE CheckIO;
BEGIN
IF IOResult <> 0 THEN Halt (7);
END;
PROCEDURE cursorOff; ASSEMBLER;
(* Routine from SWAG *)
ASM
mov AH, 3; mov BH, 0; Int $10; OR CH, $20; mov AH, 1; Int $10;
END;
PROCEDURE cursorOn; ASSEMBLER;
(* Routine from SWAG *)
ASM
mov AH, 3; mov BH, 0; Int $10; AND CH, NOT $20; mov AH, 1; Int $10;
END;
PROCEDURE updateCursor;
BEGIN
cursorState := Succ (cursorState) AND 3;
Write (cursorData [cursorState], ^H);
END;
FUNCTION WhereX: BYTE; ASSEMBLER;
(* Routine from SWAG *)
ASM
MOV AH, 3 {Ask For current cursor position}
MOV BH, 0 { On page 0 }
Int 10h { Return inFormation in DX }
Inc DL { Bios Assumes Zero-based. Crt.WhereX Uses 1 based }
MOV AL, DL { Return X position in AL For use in Byte Result }
END;
FUNCTION WhereY: BYTE; ASSEMBLER;
(* Routine from SWAG *)
ASM
MOV AH, 3 {Ask For current cursor position}
MOV BH, 0 { On page 0 }
Int 10h { Return inFormation in DX }
Inc DH { Bios Assumes Zero-based. Crt.WhereY Uses 1 based }
MOV AL, DH { Return Y position in AL For use in Byte Result }
END;
PROCEDURE GotoXY (X, Y: BYTE); ASSEMBLER;
(* Routine from SWAG *)
ASM
MOV DH, Y { DH = Row (Y) }
MOV DL, X { DL = Column (X) }
Dec DH { Adjust For Zero-based Bios routines }
Dec DL { Turbo Crt.GotoXY is 1-based }
MOV BH, 0 { Display page 0 }
MOV AH, 2 { Call For SET CURSOR POSITION }
Int 10h
END;
PROCEDURE WriteCharAtCursor (X: CHAR);
(* Routine from SWAG *)
VAR
reg: REGISTERS;
BEGIN
reg. AH := $0A;
reg. AL := Ord (X);
reg. BH := $00; {* Display Page Number. * for Graphics Modes! *}
reg. CX := 1; {* Word for number of characters to write *}
Intr ($10, reg);
END;
PROCEDURE ClrEol;
(* Routine by DDA *)
VAR
NumCol: WORD ABSOLUTE $0040: $004A; { Number of CRT columns (1-based) }
X, Y, DistanceToRight: BYTE;
BEGIN
X := WhereX;
Y := WhereY;
DistanceToRight := NumCol - X;
Write ('': DistanceToRight);
WriteCharAtCursor (#32);
GotoXY (X, Y);
END;
PROCEDURE WriteMemAvail;
BEGIN
GotoXY (60, WhereY);
WriteLn ('Free RAM: ', MemAvail);
END;
FUNCTION IsFile (CONST FileName: PATHSTR): BOOLEAN;
VAR
Attr : WORD;
cFile : FILE;
BEGIN
Assign (cFile, FileName);
GetFAttr (cFile, Attr);
IF (DosError = 0) AND ((Attr AND Directory) <> Directory)
THEN IsFile := TRUE
ELSE IsFile := FALSE;
END;
PROCEDURE EraseFile (CONST FileName : STRING);
VAR
cFile : FILE;
BEGIN
IF IsFile (FileName) THEN BEGIN
Assign (cFile, FileName);
SetFAttr (cFile, 0);
Erase (cFile); CheckIO;
END;
END;
PROCEDURE UpFast (VAR Str: STRING); {** from SWAG **}
INLINE ($8C/$DA/$5E/$1F/$FC/$AC/$30/$E4/$89/$C1/$E3/$12/$BB/Ord('a')/Ord('z')/
$AC/$38/$D8/$72/$08/$38/$F8/$77/$04/$80/$6C/$FF/$20/$E2/$F1/$8E/$DA);
FUNCTION UpStr (lstr : STRING): STRING;
BEGIN
upfast (lstr);
UpStr := lstr;
END;
FUNCTION LowerStr (w: STRING): STRING;
VAR
cp : INTEGER; {T